const env = require('./config.js'); //配置文件，在这文件里配置你的OSS keyId和KeySecret,timeout:87600;

const base64 = require('./base64.js');//Base64,hmac,sha1,crypto相关算法
require('./hmac.js');
require('./sha1.js');
const Crypto = require('./crypto.js');

/*
 *上传文件到阿里云oss
 *@param - filePath :图片的本地资源路径
 *@param - successc:成功回调
 *@param - types:图片或者视频
 *@param - failc:失败回调
 */
const uploadFile = function (filePath, types, successc, failc) {
  // || filePath.length < 9
  if (!filePath) {
    uni.showModal({
      title: '图片错误',
      content: '请重试',
      showCancel: false,
    })
    return;
  }
  //图片名字 可以自行定义，     这里是采用当前的时间戳 + 150内的随机数来给图片命名的
  const aliyunFileKey = 'uni_app/user/' + new Date().getTime() + Math.floor(Math.random() * 150) + types;
  const aliyunServerURL = env.uploadImageUrl;//OSS自定义地址，需要https
  const fileHostURL = env.fileHost;//OSS上传地址，需要https
  const accessid = env.OSSAccessKeyId;
  const policyBase64 = getPolicyBase64();
  const signature = getSignature(policyBase64);//获取签名
  return new Promise((resolve,reject)=>{
    uni.uploadFile({
      url: fileHostURL,//开发者服务器 url
      filePath: filePath,//要上传文件资源的路径
      name: 'file',//必须填file
      formData: {
        'key': aliyunFileKey,
        'policy': policyBase64,
        'OSSAccessKeyId': accessid,
        'signature': signature,
        'success_action_status': '200',
      },
      success: function (res) {
        console.log(res);
        if (res.statusCode != 200) {
          console.log("上传错误");
          return;
        }
        resolve(aliyunServerURL+aliyunFileKey)
        // successc(aliyunServerURL+aliyunFileKey);
      },
      fail: function (err) {
        // err.wxaddinfo = aliyunServerURL;
        reject(aliyunServerURL)
        console.log(err);
      },
    })
  })
}

const getPolicyBase64 = function () {
  let date = new Date();
  date.setHours(date.getHours() + env.timeout);
  let srcT = date.toISOString();
  const policyText = {
    "expiration": srcT, //设置该Policy的失效时间，超过这个失效时间之后，就没有办法通过这个policy上传文件了 
    "conditions": [
      ["content-length-range", 0, 500 * 1024 * 1024] // 设置上传文件的大小限制,500mb
    ]
  };

  const policyBase64 = base64.encode(JSON.stringify(policyText));
  return policyBase64;
}

const getSignature = function (policyBase64) {
  const accesskey = env.AccessKeySecret;

  const bytes = Crypto.HMAC(Crypto.SHA1, policyBase64, accesskey, {
    asBytes: true
  });
  const signature = Crypto.util.bytesToBase64(bytes);
  return signature;
}

module.exports = uploadFile;